
#ifndef __TTUSB_H_
#define __TTUSB_H_



// typedef int (* bulk_in_req_cbk)( void * parg, uint8_t * ptr, int tmax );
typedef int (* bulk_proc_cbk)( void * parg, uint8_t * ptr, int tsiz );


typedef struct _tag_usbd_intf {

    char * str_intf;

    void * pctx;
    
    /**/
    int epcnt;
    uint8_t  epadrs[8];

} usbd_intf_t;


typedef struct _tag_usbd_endp
{
    usbd_intf_t * pifc;

    int  pid;
    bulk_proc_cbk  pfunc;

} usbd_endp_t;


typedef struct _tag_usbd_config {
    
    /***** device */
    uint16_t vid;
    uint16_t pid;
    
    char * str_manu;
    char * str_prod;
    char * str_seri;

    /***** config */
    char * str_cnfg;
    uint8_t maxpower;

    /***** interface */
    usbd_intf_t  iface[1];

    /***** end points **/
    int  used;
    usbd_endp_t  endps[15];

} usbd_config_t;




/*
实现约束:
(a) 仅仅支持 1 个interface.
(c) 所有的 endp 仅仅支持 bulk 通信协议.
(b) 支持定时协议类型, 通过 winusb 的接口来开发.
*/


/* config: device */
int ttusb_desc_device_vid_pid( usbd_config_t * pcfg, uint16_t vid, uint16_t pid );
int ttusb_desc_device_str_manu( usbd_config_t * pcfg, char * str );
int ttusb_desc_device_str_prod( usbd_config_t * pcfg, char * str );
int ttusb_desc_device_str_seri( usbd_config_t * pcfg, char * str );

/**/
int ttusb_desc_config_str( usbd_config_t * pcfg, char * str );
int ttusb_desc_config_power( usbd_config_t * pcfg, uint8_t pwr );

/* config: interface, endpoint */
int ttusb_desc_interface_str( usbd_config_t * pcfg, char * str );
int ttusb_desc_interface_add_inp( usbd_config_t * pcfg, bulk_proc_cbk cbkf );
int ttusb_desc_interface_add_outp( usbd_config_t * pcfg, bulk_proc_cbk cbkf );

/**/
int ttusb_desc_init( usbd_config_t * pcfg );


/**/
int usbd_setup_d2h_proc( usbd_config_t * pcfg, usb_setup_packet_t * pkt, uint8_t * ptr );

#endif


